/*
 * State
 *
 * Authors: Lasse Collin <lasse.collin@tukaani.org>
 *          Igor Pavlov <http://7-zip.org/>
 *
 * This file has been put into the public domain.
 * You can do whatever you want with this file.
 */

package org.tukaani.xz.lzma;

final class State
{
  static final int STATES = 12;

  private static final int LIT_STATES = 7;

  private static final int LIT_LIT = 0;

  private static final int SHORTREP_LIT_LIT = 3;

  private static final int LIT_MATCH = 7;

  private static final int LIT_LONGREP = 8;

  private static final int LIT_SHORTREP = 9;

  private static final int NONLIT_MATCH = 10;

  private static final int NONLIT_REP = 11;

  private int state;


  State()
  {
  }


  State(State other)
  {
    state = other.state;
  }


  void reset()
  {
    state = LIT_LIT;
  }


  int get()
  {
    return state;
  }


  void set(State other)
  {
    state = other.state;
  }


  void updateLiteral()
  {
    if (state <= SHORTREP_LIT_LIT)
      state = LIT_LIT;
    else if (state <= LIT_SHORTREP)
      state -= 3;
    else
      state -= 6;
  }


  void updateMatch()
  {
    state = state < LIT_STATES ? LIT_MATCH : NONLIT_MATCH;
  }


  void updateLongRep()
  {
    state = state < LIT_STATES ? LIT_LONGREP : NONLIT_REP;
  }


  void updateShortRep()
  {
    state = state < LIT_STATES ? LIT_SHORTREP : NONLIT_REP;
  }


  boolean isLiteral()
  {
    return state < LIT_STATES;
  }
}
